﻿using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

using D3Sparrow.Core.Common;


namespace D3Sparrow.Core.Structures
{
    //sizeof = 0x10
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x10)]
    unsafe public struct MemHeader
    {
        public uint id;				// 0x000
        public fixed uint pad_004[3];		// 0x004
    };

    //sizeof = 0x20
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x20)]
    unsafe public struct FileHeader
    {
        public uint deadbeef;			// 0x000
        public uint snoGroup;			// 0x004
        public fixed uint pad_008[2];		// 0x008
        public MemHeader mempart;		// 0x010
    };

    //sizeof = 0x10
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x10)]
    unsafe public struct DataPtr
    {
        public uint file_offset;		// 0x000
        public uint size;				// 0x004
        public uint mem_offset;		// 0x008
        public uint unused;			// 0x00C
    };

    //sizeof = 0x8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x8)]
    unsafe public struct DataPtr2
    {

        public uint file_offset;		// 0x000
        public uint size;				// 0x004
    };

    //sizeof = 0x14
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x14)]
    unsafe public struct AxialCylinder
    {

        public Vec3 Position;			// 0x000
        public float Ax1;				// 0x00C
        public float Ax2;				// 0x010
    };

    //sizeof = 0x10
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x10)]
    unsafe public struct Sphere
    {
        public Vec3 Position;			// 0x000
        public float Radius;			// 0x00C
    };

    //sizeof = 0x44
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x44)]
    unsafe public struct WeightedLook
    {
        public fixed char LookLinkp[64];		// 0x000
        public uint pad_040;			// 0x040
    };

    //sizeof = 0x44
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x44)]
    unsafe public struct ActCollData
    {

        public fixed uint ColFlags[4];		// 0x000
        public uint pad_010;			// 0x010
        public AxialCylinder Cylinder;	// 0x014
        public AABB aabb;				// 0x028
        public float pad_;				// 0x040
    };

    //sizeof = 0x14
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x14)]
    unsafe public struct MonsterDef
    {

        public fixed float floats[4];		// 0x000
        public uint intval;			// 0x010
    };

    //sizeof = 0x10
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x10)]
    unsafe public struct MobSkillDecl
    {

        public float F0;				// 0x000
        public float F1;				// 0x004
        public uint I0;				// 0x008
        public float F2;				// 0x00C
    };

    //sizeof = 0x8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x8)]
    unsafe public struct SkillDecl
    {

        public uint SNOPower;			// 0x000
        public uint I0;				// 0x004
    };

    //sizeof = 0xC
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0xC)]
    unsafe public struct HPDropInfo
    {

        public float F0;				// 0x000
        public uint GBID;				// 0x004
        public uint I1;				// 0x008
    };

    //sizeof = 0x8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x8)]
    unsafe public struct NavMeshSquare
    {

        public float z;					// 0x000
        public NavCellFlagsDW flags;		// 0x004
    };

    //sizeof = 0x6
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x6)]
    unsafe public struct NavGridSquare
    {

        public NavCellFlagsW Flags;		// 0x000
        public ushort W1;					// 0x002
        public ushort CellLookupIndex;		// 0x004
    };

    //sizeof = 0x20
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x20)]
    unsafe public struct NavCell
    {

        public Vec3 Min;					// 0x000
        public Vec3 Max;					// 0x00C
        public NavCellFlagsW Flag;			// 0x018
        public ushort NeighbourCount;		// 0x01A
        public uint NeighborsIndex;		// 0x01C
    };

    //sizeof = 0x4
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x4)]
    unsafe public struct NavCellLookup
    {

        public NavCellFlagsW Flags;		// 0x000
        public ushort WCell;					// 0x002
    };

    //sizeof = 0x128
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x128)]
    unsafe public struct NavMeshDef
    {

        public uint SquaresX;				// 0x000
        public uint SquaresY;				// 0x004
        public uint pad_008;				// 0x008
        public uint SquareCount;			// 0x00C
        public float pad_010;				// 0x010
        public DataPtr2 Squares;			// 0x014
        public uint pad_01C;				// 0x01C
        public NavMeshSquare* array_ptr;	// 0x020
        public uint pad_024;				// 0x024
        public fixed char name[256];				// 0x028
    };

    //sizeof = 0x84
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x84)]
    unsafe public struct NavZoneDef
    {

        public uint NavCellCount;			// 0x000
        public fixed uint pad_004[3];			// 0x004
        public DataPtr2 NavCells;			// 0x010
        public uint NeighbourCount;		// 0x018
        public fixed uint pad_01C[3];			// 0x01C
        public DataPtr2 NavCellNeighbours; // 0x024
        public fixed float pad_02C[2];			// 0x02C
        public uint pad_034;				// 0x034
        public Vec2 V0;					// 0x038
        public fixed uint pad_040[3];			// 0x040
        public DataPtr2 GridSquares;		// 0x04C
        public fixed uint pad_054[4];			// 0x054
        public DataPtr2 CellLookups;		// 0x064
        public uint BorderDataCount;		// 0x06C
        public fixed uint pad_070[3];			// 0x070
        public DataPtr2 BorderData;		// 0x07C
    };


    //--------------Main SNO unsafe public structes--------------

    //sizeof = 0x354
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x354)]
    unsafe public struct SNOActor
    {

        public MemHeader header;		// 0x000
        public ActorType type;			// 0x010
        public uint ApperanceSNO;		// 0x014
        public uint PhysMeshSNO;		// 0x018
        public AxialCylinder Cylinder; // 0x01C
        public Sphere sphere;			// 0x030
        public AABB AABBBounds;		// 0x040
        public DataPtr TagMap;			// 0x058
        public uint AnimSetSNO;		// 0x068
        public uint MonsterSNO;		// 0x06C
        public DataPtr MsgEvents;		// 0x070
        public fixed uint pad_080[2];		// 0x080
        public Vec3 V0;				// 0x088
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public WeightedLook[] Looks;	// 0x094
        public uint PhysicsSNO;		// 0x2B4
        public fixed uint pad_2B8[2];		// 0x2B8
        public fixed float pad_2C0[3];		// 0x2C0
        public ActCollData ColData;	// 0x2CC
        public fixed uint InvImages[10];	// 0x310
        public fixed uint pad_338[2];		// 0x338
        public uint BitField0;		// 0x340
        public DataPtr2 CastingNotes;	// 0x344
        public DataPtr2 VoiceOverRole;	// 0x34C
    };

    //sizeof = 0x4AA
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x4AA)]
    unsafe public struct SNOMonster
    {

        public MemHeader header;			// 0x000
        public uint ActorSNO;				// 0x010
        public uint pad_014;				// 0x014
        public MonsterType Type;			// 0x018
        public MonsterRace Race;			// 0x01C
        public uint Size;					// 0x020
        public MonsterDef mobdef;			// 0x024
        public uint Resists;				// 0x038
        public fixed uint pad_03C[2];			// 0x03C
        public uint lvlNormal;			// 0x044
        public uint lvlNightmare;			// 0x048
        public uint lvlHell;				// 0x04C
        public uint lvlInferno;			// 0x050
        public fixed float pad_[139];			// 0x054
        public fixed float floats[6];			// 0x280
        public uint pad_2EC;				// 0x298
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public HPDropInfo [] DropInfo;		// 0x29C
        public uint SNOSkillKit;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]// 0x2CC
        public SkillDecl [] skills;		// 0x2D0

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public MobSkillDecl [] mobskills;	// 0x310
        public uint SNOTCFirstKill;		// 0x390
        public uint SNOTC;				// 0x394
        public uint SNOTCRare;			// 0x398
        public uint SNOTCChamp;			// 0x39C
        public uint SNOTCChampLight;		// 0x3A0
        public fixed byte pad_3A4[32];			// 0x3A4
        public uint SNOInv;				// 0x3C4
        public uint SNOSecondInv;			// 0x3C8
        public uint SNOLore;				// 0x3CC
        public fixed uint AIBehavior[6];		// 0x3D0
        public fixed uint GbidArray0[8];		// 0x3E8
        public fixed uint SNOSummonActor[6];	// 0x408
        public fixed uint GbidArray1[4];		// 0x420
        public fixed uint GbidArray2[6];		// 0x430
        public fixed uint pad_448[3];			// 0x448
        public uint PowerType;			// 0x454
        public fixed uint pad_458[6];			// 0x458
        public DataPtr2 TagMap;			// 0x470
        public fixed uint pad_478[6];			// 0x478
        public DataPtr2 MinionSpawn;		// 0x490
        public fixed char Name[128];				// 0x498
    };

    //sizeof = 0x30C
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x30C)]
    unsafe public struct SNOScene
    {

        public MemHeader header;			// 0x000
        public AABB AABBBounds;			// 0x010
        public AABB AABBMarketSetBounds;	// 0x028
        public NavMeshDef navmesh;			// 0x040
        public DataPtr2 Exclusions;		// 0x168
        public fixed uint pad_170[14];			// 0x170
        public DataPtr2 Inclusions;		// 0x1A8
        public fixed uint pad_1B0[14];			// 0x1B0
        public DataPtr2 MarkerSets;		// 0x1E8
        public fixed uint pad_1F0[14];			// 0x1F0
        public fixed char lootlink[64];			// 0x228
        public DataPtr2 MapTrigEvent;		// 0x268
        public fixed uint pad_270[4];			// 0x270
        public NavZoneDef NavZone;			// 0x280
        public uint SNOAppearance;		// 0x304
        public uint SNOPhysMesh;			// 0x308
    };

    //--------------GameBalance unsafe public structes--------------

    //sizeof - 0x3A8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x3A8)]
    unsafe public struct SNOGBHeader
    {

        public uint SnoID;					// 0x000
        public uint unknown_004;				// 0x004
        public uint count;					// 0x008
        public SNOGBType type;					// 0x00C
        public fixed char gbi[0x100];				// 0x010
        public fixed char xls[0x100];				// 0x110
        public uint unknown_0210;				// 0x210
        public uint unknown_0214;				// 0x214
        public DataPtr ItemType;				// 0x218
        public DataPtr Item;					// 0x228
        public DataPtr Experience;				// 0x238
        public DataPtr HelpCodes;				// 0x248
        public DataPtr MonsterLevel;			// 0x258
        public DataPtr Affixes;				// 0x268
        public DataPtr Heros;					// 0x278
        public DataPtr MovementStyles;			// 0x288
        public DataPtr Labels;					// 0x298
        public DataPtr LootDistribution;		// 0x2A8
        public DataPtr RareItemNames;			// 0x2B8
        public DataPtr MonsterAffixes;			// 0x2C8
        public DataPtr RareMonsterNames;		// 0x2D8
        public DataPtr SocketedEffects;		// 0x2E8
        public DataPtr ItemEnhancement;		// 0x2F8
        public DataPtr ItemDropTable;			// 0x308
        public DataPtr ItemLevelModifiers;		// 0x318
        public DataPtr QualityClasses;			// 0x328
        public DataPtr Hirelings;				// 0x338
        public DataPtr SetItemBonus;			// 0x348
        public DataPtr EliteModifiers;			// 0x358
        public DataPtr ItemTiers;				// 0x368
        public DataPtr PowerFormula;			// 0x378
        public DataPtr Recipes;				// 0x388
        public DataPtr SAE;					// 0x398
        //char padding[0x10];			// 0x3A8
    };

    //sizeof = 0x14
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x14)]
    unsafe public struct AttribSpec
    {

        public uint AttributeId;		// 0x000
        public uint SNOParam;			// 0x004
        public fixed uint pad0[2];			// 0x008
        public DataPtr2 Formula;		// 0x00C
    };

    //sizeof =  0x5F8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x5F8)]
    unsafe public struct SNOGBItem
    {

        public uint pad0;									// 0x000
        public fixed char Name[0x100];							// 0x004
        public uint SNOActorID;							// 0x104
        public uint ItemType1;							// 0x108
        public uint Flags;								// 0x10C
        public uint I0;									// 0x110
        public uint ItemLevel;							// 0x114	
        public uint eItem;								// 0x118
        public uint I2;									// 0x11C
        public uint RandomPropertiesCount;				// 0x120
        public uint MaxSockets;							// 0x124
        public uint MaxStackAmount;						// 0x128
        public uint BaseGoldValue;						// 0x12C
        public uint I7;									// 0x130
        public uint RequiredLevel;						// 0x134
        public uint DurabilityMin;						// 0x138
        public uint DurabilityDelta;						// 0x13C
        public uint I8;									// 0x140
        public uint SNOBaseItem;							// 0x144
        public uint SNOSet;								// 0x148
        public uint SNOComponentTreasureClass;			// 0x14C
        public uint SNOComponentTreasureClassMagic;		// 0x150
        public uint SNOComponentTreasureClassRare;		// 0x154
        public uint SNORareNamePrefixStringList;			// 0x158
        public uint SNORareNameSuffixStringList;			// 0x15C
        public fixed uint I15[4];								// 0x160
        public fixed byte pad1[88];								// 0x170
        public float WeaponDamageMin;						// 0x1C8
        public float WeaponDamageDelta;					// 0x1CC
        public fixed byte pad2[84];								// 0x1D0
        public float ArmorValue;							// 0x224
        public float F3;									// 0x228
        public fixed byte pad3[168];							// 0x22C
        public float AttacksPerSecond;						// 0x2D4
        public fixed byte pad4[84];								// 0x2D8
        public float F4;									// 0x32C
        public float F5;									// 0x330
        public fixed byte pad5[104];							// 0x334
        public uint SNOSkill0;							// 0x39C
        public uint I11;									// 0x3A0
        public uint SNOSkill1;							// 0x3A4
        public uint I12;									// 0x3A8
        public uint SNOSkill2;							// 0x3AC
        public uint I13;									// 0x3B0
        public uint SNOSkill3;							// 0x3B4
        public uint I14;									// 0x3B8
        public fixed byte pad6[44];								// 0x3BC
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public AttribSpec[] Attributes;					// 0x3E8
        public uint ItemQuality;							// 0x568
        public fixed uint RecipeToGrant[10];					// 0x56C
        public uint EnhancementToGrant;					// 0x594
        public fixed uint LegendaryAffixFamily[6];				// 0x598
        public fixed uint MaxAffixLevel[6];						// 0x5B0
        public fixed uint I18[6];								// 0x5C8
        public uint GemType;								// 0x5E0
        public uint I16;									// 0x5E4
        public uint Alpha;								// 0x5E8
        public fixed uint pad7[3];  							// 0x5EC
    };


     //sizeof = 0x54
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x54)]
    unsafe public struct NavZoneRaw
    {

        public uint id_navzone;        // 0x000
        public uint id_world;          // 0x004
        public uint id_SceneSNO;       // 0x008
        public Vec2 unknown_00C;        // 0x00C
        public uint unknown_014;       // 0x014
        public Vec2 zoneMin;            // 0x018
        public Vec2 zoneMax;            // 0x020
        public fixed uint unknown_028[8];    // 0x028
        public uint pNavZoneDefRaw;    // 0x048
        public uint pSceneRecord;      // 0x04C
        public uint unknown_050;       // 0x050
    };

    //sizeof = 0x1C8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x1C8)]
    unsafe public struct NavMeshRaw
    {

        public uint id_navmesh;        // 0x000
        public uint id_world;          // 0x004
        public fixed uint unknown_008[3];    // 0x008
        public uint sno_levelarea;     // 0x014
        public fixed uint unknown_018[3];    // 0x018
        public uint sno_portalWorld;   // 0x024
        public fixed uint unknown_028[10];   // 0x028
        public float unknown_050;       // 0x050
        public fixed uint unknown_054[5];    // 0x054
        public float unknown_068;       // 0x068
        public fixed uint unknown_06C[8];    // 0x06C
        public uint sizeX;             // 0x08C
        public uint sizeY;             // 0x090
        public AABB unknown_094;       // 0x094
        public AABB unknown_0AC;       // 0x0AC
        public fixed uint unknown_0C4[5];    // 0x0C4
        public uint id_SceneSNO;       // 0x0D8
        public fixed uint unknown_0DC[4];    // 0x0DC
        public Vec2 MeshMin;            // 0x0EC
        public fixed uint unknown_0F4[16];   // 0x0F4
        public AABB bounds;             // 0x134
        public AABB boundsMarker;       // 0x14C
        public Vec2 MeshMax;            // 0x164
        public fixed float unknown_16C[3];    // 0x16C
        public uint unknown_178;       // 0x178
        public NavZoneRaw* pZone;       // 0x17C
        public fixed uint unknown_180[9];    // 0x180
        public uint unknown_1A4;       // 0x1A4 Read by D3::NavMesh::GetFlags
        public uint unknown_1A8;       // 0x1A8
        public fixed uint unknown_1AC[7];    // 0x1AC
    };

    //sizeof = 0x2A8
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x2A8)]
    unsafe public struct SceneRaw
    {

        int id_scene;           // 0x000
        NavMeshRaw navmesh;     // 0x004
        public fixed uint unknown_1CC[55];  // 0x1CC
    };

    //sizeof = 0x42C
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x42C)]
    unsafe public struct RActor
    {

        public uint id_actor;         // 0x000
        public uint id_acd;           // 0x004
        public fixed char Name[128];         // 0x008
        public uint id_sno;           // 0x088
        public uint unknown_8C;       // 0x08C 
        public Vec3 Rot;               // 0x090 
        public float fUnk_Rot;         // 0x09C 
        public Vec3 Pos;               // 0x0A0
        public float fUnk_130;         // 0x0AC 
        public Vec3 Pos1;              // 0x0B0 
        public float fUnk_734;         // 0x0BC 
        public Vec3 Pos2;              // 0x0C0 
        public uint unknown_CC;       // 0x0CC 
        public float RadiusDefault;    // 0x0D0 
        public uint unknown_D4;       // 0x0D4 
        public uint guid_world;       // 0x0D8 
        public uint guid_scene;       // 0x0DC 
        public fixed uint unknown_E0[8];    // 0x0E0 
        public Vec3 Pos3;              // 0x100 
        public fixed uint unknown_10C[5];   // 0x10C 
        public uint unknown_120;      // 0x120
        public fixed uint unknown_124[7];   // 0x124
        public Vec3 Pos4;              // 0x140 
        public fixed uint unknown_14C[4];   // 0x14C 
        public uint N13E1EB50;        // 0x15C 
        public fixed uint unknown_160[45];  // 0x160 
        public Vec3 PosObj;            // 0x214 
        public fixed uint unknown_21C[89];  // 0x220 
        public ActorMovement* Mov;    // 0x384
        public float Direction;        // 0x388 
        public fixed uint unknown_388[6];   // 0x38C 
        public Vec3 Vel;               // 0x3A4 
        public Vec3 Pos6;              // 0x3B0 
        public fixed uint unknown_3B8[24];  // 0x3BC 
        public uint Frame;            // 0x41C 
        public uint Diff;             // 0x420 
        public fixed uint unknown_420[2];   // 0x424 
    };

    //sizeof = 0x48
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x48)]
    unsafe public struct World
    {

        public uint unknown_0;        // 0x000 
        public uint sno_id;           // 0x004
        public uint id;               // 0x008
        void* pMatrix;          // 0x00C
        Vec3* a;                // 0x010 
        Vec3* b;                // 0x014 
        public fixed uint unknown_18[12];   // 0x018 
    };

    //sizeof = 0x43C ?
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 0x43C)]
    unsafe public struct ActorMovement
    {
        public uint* vt;              // 0x000 
        public uint Active;           // 0x004 
        public float Speed;            // 0x008 
        public float SpeedCurrent;     // 0x00C 
        public uint fix;              // 0x010
        public fixed uint unknown_14[2];    // 0x014 
        public float ScaleSize;        // 0x01C 
        public uint Flags;            // 0x020 
        public uint unknown_24;       // 0x024
        public uint fix2;             // 0x028 Set to 0x00220018 for fix
        public fixed uint unknown_2C[2];    // 0x02C
        public uint IsMoving;         // 0x034 
        public uint PathIsWalkable;   // 0x038
        public fixed byte unknown_3C[4];    // 0x03C
        public Vec3 MovTo;             // 0x040 
        public uint guid_world;       // 0x04C 
        public Vec3 Pos2;              // 0x050 
        public fixed float unknown_5C[2];    // 0x05C 
        public fixed uint unknown_64[5];    // 0x064 
        public Vec3 Tp;                // 0x078 
        public fixed byte unknown_84[8];    // 0x084 
        public uint unk;              // 0x08c 
        public uint unknown_90;       // 0x090 
        public uint guid_mesh;        // 0x094
        public fixed uint unknown_98[4];    // 0x098
        public Vec3 Pos3;              // 0x0A8 
        public uint guid_world2;      // 0x0B4 
        public uint unknown_B8;       // 0x0B8
        public float Speed2;           // 0x0BC 
        public fixed uint unknown_C0[40];   // 0x0C0 
        public uint id_actor;         // 0x160 
        public uint FrameMov;         // 0x164 
        public uint Frame;            // 0x168 
        public uint FramePrev;        // 0x16C 
        public fixed byte unknown_170[4];   // 0x170 
        public float Direction;        // 0x174 
        public fixed uint unknown_178[177]; // 0x178
    };


    public enum MobRareType
    {
        normal = 0,
        elite = 1,
        yellow = 2,
        purple = 3,
        key_warden = 4
    }
}



